"""
3427. 变长子数组求和
简单
相关标签
premium lock icon
相关企业
提示
给你一个长度为 n 的整数数组 nums 。对于 每个 下标 i（0 <= i < n），定义对应的子数组 nums[start ... i]（start = max(0, i - nums[i])）。

返回为数组中每个下标定义的子数组中所有元素的总和。

子数组 是数组中的一个连续、非空 的元素序列。


示例 1：

输入：nums = [2,3,1]

输出：11

解释：

下标 i	子数组	和
0	nums[0] = [2]	2
1	nums[0 ... 1] = [2, 3]	5
2	nums[1 ... 2] = [3, 1]	4
总和	 	11
总和为 11 。因此，输出 11 。

示例 2：

输入：nums = [3,1,1,2]

输出：13

解释：

下标 i	子数组	和
0	nums[0] = [3]	3
1	nums[0 ... 1] = [3, 1]	4
2	nums[1 ... 2] = [1, 1]	2
3	nums[1 ... 3] = [1, 1, 2]	4
总和	 	13
总和为 13 。因此，输出为 13 。



提示：

1 <= n == nums.length <= 100
1 <= nums[i] <= 1000


"""
from typing import List

class Solution:
    def subarraySum(self, nums: List[int]) -> int:
        pre = [nums[0]]
        for i in range(1,len(nums)):
            pre.append(pre[-1] + nums[i])
        ans = 0
        for i in range(len(nums)):
            ans += pre[i]
            if i-nums[i] - 1 >=0:
                ans -= pre[i-nums[i] - 1 ]
        return ans

if __name__ == '__main__':
    print(Solution().subarraySum([2,3,1]))